package lc.weekly;

import lc.common.TreeNode;

/**
 * <a href="https://leetcode-cn.com/contest/weekly-contest-292">第 292 场周赛</a>
 * <p>
 * 本场竞赛由「Cider & 力扣」联合主办
 */
public interface WeeklyContest292 {

    /**
     * 6056. 字符串中最大的 3 位相同数字
     * <p>
     * <p>
     * 给你一个字符串 num ，表示一个大整数。如果一个整数满足下述所有条件，则认为该整数是一个 优质整数 ：
     *
     * <ul>
     *     <li>该整数是 num 的一个长度为 3 的 <strong>子字符串</strong> 。</li>
     *     <li>该整数由唯一一个数字重复 3 次组成。</li>
     * </ul>
     * <p>
     * 以字符串形式返回 <strong>最大的优质整数</strong> 。如果不存在满足要求的整数，则返回一个空字符串 "" 。
     * <p>
     * <strong>注意：</strong>
     * <ul>
     *     <li><strong>子字符串</strong> 是字符串中的一个连续字符序列。</li>
     *     <li>num 或优质整数中可能存在 <strong>前导零</strong> 。</li>
     * </ul>
     *
     * <strong>提示：</strong>
     * <ul>
     *     <li>3 <= num.length <= 1000</li>
     *     <li>num 仅由数字（0 - 9）组成</li>
     * </ul>
     *
     * @param num
     * @return
     */
    String largestGoodInteger(String num);

    /**
     * 6057. 统计值等于子树平均值的节点数
     * <p>
     * <p>
     * 给你一棵二叉树的根节点 root ，找出并返回满足要求的节点数，要求节点的值等于其 <strong>子树</strong> 中值的 <strong>平均值</strong> 。
     *
     * <strong>注意：</strong>
     * <ul>
     *     <li>n 个元素的平均值可以由 n 个元素 <strong>求和</strong> 然后再除以 n ，并 <strong>向下舍入</strong> 到最近的整数。</li>
     *     <li>root 的 <strong>子树</strong> 由 root 和它的所有后代组成。</li>
     * </ul>
     *
     * <strong>提示：</strong>
     * <ul>
     *     <li>树中节点数目在范围 [1, 1000] 内</li>
     *     <li>0 <= Node.val <= 1000</li>
     * </ul>
     *
     * @param root
     * @return
     */
    int averageOfSubtree(TreeNode root);

    /**
     * 6058. 统计打字方案数
     * <p>
     * <p>
     * Alice 在给 Bob 用手机打字。数字到字母的 对应 如下图所示。
     * <p>
     * <img src='https://assets.leetcode.com/uploads/2022/03/15/1200px-telephone-keypad2svg.png' />
     * </p>
     * 为了 <strong>打出</strong> 一个字母，Alice 需要 <strong>按</strong> 对应字母 i 次，i 是该字母在这个按键上所处的位置。
     * <ul>
     *     <li>比方说，为了按出字母 's' ，Alice 需要按 '7' 四次。类似的， Alice 需要按 '5' 两次得到字母  'k' 。</li>
     *     <li>注意，数字 '0' 和 '1' 不映射到任何字母，所以 Alice <strong>不</strong> 使用它们。</li>
     * </ul>
     * 但是，由于传输的错误，Bob 没有收到 Alice 打字的字母信息，反而收到了 <strong>按键的字符串信息</strong> 。
     * <ul>
     *     <li>比方说，Alice 发出的信息为 "bob" ，Bob 将收到字符串 "2266622" 。</li>
     * </ul>
     * <p>
     * 给你一个字符串 pressedKeys ，表示 Bob 收到的字符串，请你返回 Alice <strong>总共可能发出多少种文字信息</strong> 。
     * <p>
     * 由于答案可能很大，将它对 10<sup>9</sup> + 7 <strong>取余</strong> 后返回。
     *
     * <strong>提示：</strong>
     * <ul>
     *     <li>1 <= pressedKeys.length <= 10<sup>5</sup></li>
     *     <li>pressedKeys 只包含数字 '2' 到 '9' 。</li>
     * </ul>
     *
     * @param pressedKeys
     * @return
     */
    int countTexts(String pressedKeys);

    /**
     * 6059. 检查是否有合法括号字符串路径
     * <p>
     * <p>
     * 一个括号字符串是一个 <strong>非空</strong> 且只包含 '(' 和 ')' 的字符串。如果下面 <strong>任意</strong> 条件为 <strong>真</strong> ，那么这个括号字符串就是 <strong>合法的</strong> 。
     * <ul>
     *     <li>字符串是 () 。</li>
     *     <li>字符串可以表示为 AB（A 连接 B），A 和 B 都是合法括号序列。</li>
     *     <li>字符串可以表示为 (A) ，其中 A 是合法括号序列。</li>
     * </ul>
     * <p>
     * 给你一个 m x n 的括号网格图矩阵 grid 。网格图中一个 <strong>合法括号路径</strong> 是满足以下所有条件的一条路径：
     * <ul>
     *     <li>路径开始于左上角格子 (0, 0) 。</li>
     *     <li>路径结束于右下角格子 (m - 1, n - 1) 。</li>
     *     <li>路径每次只会向 <strong>下</strong> 或者向 <strong>右</strong> 移动。</li>
     *     <li>路径经过的格子组成的括号字符串是 <strong>合法</strong> 的。</li>
     * </ul>
     * 如果网格图中存在一条 <strong>合法括号路径</strong> ，请返回 true ，否则返回 false 。
     *
     * <strong>提示：</strong>
     * <ul>
     *     <li>m == grid.length</li>
     *     <li>n == grid[i].length</li>
     *     <li>1 <= m, n <= 100</li>
     *     <li>grid[i][j] 要么是 '(' ，要么是 ')' 。</li>
     * </ul>
     *
     * @param grid
     * @return
     */
    boolean hasValidPath(char[][] grid);
}
